#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include "global.h"
#include "parse.h"
#include "build.h"

#define FMAKEFILE "fmakefile" //默认fmakefile

int line_count = 0; //记录读取到哪一行

/*
 *检测读取到的一行是否为空白行，空白行定义包括两方面：
 *    1.完全空白
 *    2.只有E C H F L开头，后面除空白外没有其他字符
 */
int is_empty(const char *line){
    if(isspace(line[0]))
        return 1;
    int i = 1;
    for(;line[i] !='\n' && i < MAXLINE;i++)
        if(!isspace(line[i]))
            return 0;
    return 1; 
}

/*
 * 初始化解析并存储文件名等.
 */
void init(FILE *fp){
    char buf[MAXLINE];
    while(1){
        if(fgets(buf,MAXLINE,fp)){
            line_count++;
            if(is_empty(buf))     //过滤空白行
                continue;
            //有无法识别的符号
            if(buf[0] != 'E' && buf[0] != 'C' && buf[0] != 'H' && buf[0] != 'F' && buf[0] != 'L')   
                err_quit(UNKNOWN_TOKEN,line_count,(int)buf[0]);
            if(!isspace(buf[1]))        //开始标记后没有空白
                err_quit(BAD_FORMAT,line_count);
            buf[strlen(buf) - 1] = '\0'; //删除换行符
            split_store(buf,buf[0]);    //解析并存储相关信息
        }
        else
            break;
    }
    if(ENAME == NULL) //必须有一个E line
        err_quit(NO_ELINE);
}

int main(int argc,char *argv[]){
    FILE *fp;
    if(argc == 1){          //默认fmakefile情况
        if((fp = fopen(FMAKEFILE,"r")) == NULL)
            err_quit(NO_FMAKEFILE);
    }else if((fp = fopen(argv[1],"r")) == NULL)//输入指定文件 
        err_quit(OPEN_FAILED);

    init(fp);   
    fclose(fp);
    parse_info();//显示解析过程情况
    compile_link();
    exit(0);
}
